package com.unitd.comm.utils;

import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.unitd.frame.comm.utils.StringUtils;
import com.unitd.frame.spring.SpringInstanceFactory;
import com.unitd.modules.sys.dao.ISysDictDao;
import com.unitd.modules.sys.entity.SysDict;

import java.util.List;
import java.util.Map;

 /**
 * @desc 字典工具类
 * @filename DictUtils.java
 * @copyright www.unitd.com
 * @author Hudan
 * @version 1.0
 * @date 2017-05-15
 */
public class DictUtils {

	private static ISysDictDao sysDictDao = SpringInstanceFactory.getInstance(ISysDictDao.class);

	public static final String CACHE_DICT_MAP = "dictMap";

	 /**
	  * @desc 根据字典表中的值获取该字典数据的显示信息
	  * @param value 字典值
	  * @param type 字典类型
	  * @param defaultValue 默认值
	  * @return 字典数据的显示信息
	  */
	public static String getDictLabel(String value, String type, String defaultValue) {
		if (StringUtils.isNotBlank(type) && StringUtils.isNotBlank(value)) {
			for (SysDict dict : getDictList(type)) {
				if (type.equals(dict.getType()) && value.equals(dict.getValue())) {
					return dict.getLabel();
				}
			}
		}
		return defaultValue;
	}

	 /**
	  * @desc 根据字典表中的值获取该字典数据的显示信息
	  * @param values 字典值
	  * @param type 字典类型
	  * @param defaultValue 默认值
	  * @return 字典数据的显示信息
	  */
	public static String getDictLabels(String values, String type, String defaultValue) {
		if (StringUtils.isNotBlank(type) && StringUtils.isNotBlank(values)) {
			List<String> valueList = Lists.newArrayList();
			for (String value : StringUtils.split(values, ",")) {
				valueList.add(getDictLabel(value, type, defaultValue));
			}
			return StringUtils.join(valueList, ",");
		}
		return defaultValue;
	}

	 /**
	  * @desc 根据字典表中的显示值获取该字典数据的实际值信息
	  * @param label 显示值
	  * @param type 字典类型
	  * @param defaultLabel 默认显示值
	  * @return 字典数据的实际值信息
	  */
	public static String getDictValue(String label, String type, String defaultLabel) {
		if (StringUtils.isNotBlank(type) && StringUtils.isNotBlank(label)) {
			for (SysDict dict : getDictList(type)) {
				if (type.equals(dict.getType()) && label.equals(dict.getLabel())) {
					return dict.getValue();
				}
			}
		}
		return defaultLabel;
	}

	public static List<SysDict> getDictList(String type) {
		@SuppressWarnings("unchecked")
		Map<String, List<SysDict>> dictMap = (Map<String, List<SysDict>>) CacheUtils.get(CACHE_DICT_MAP);
		if (dictMap == null) {
			dictMap = Maps.newHashMap();
			for (SysDict dict : sysDictDao.selectAll()) {
				List<SysDict> dictList = dictMap.get(dict.getType());
				if (dictList != null) {
					dictList.add(dict);
				} else {
					dictMap.put(dict.getType(), Lists.newArrayList(dict));
				}
			}
			CacheUtils.put(CACHE_DICT_MAP, dictMap);
		}
		List<SysDict> dictList = dictMap.get(type);
		if (dictList == null) {
			dictList = Lists.newArrayList();
		}
		return dictList;
	}

	/**
	 * @desc 返回指定字典信息的json列表
	 * @param type 指定字典信息
	 * @return
	 */
	public static String getDictListJson(String type) {
//		return JsonMapper.toJsonString(getDictList(type));
		return JSON.toJSONString(getDictList(type));
	}
}